package com.example.monitordemo.util;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSON;
import lombok.experimental.UtilityClass;

import java.util.Date;
import java.util.HashMap;

import static com.example.monitordemo.constant.BlackBoxConstant.AVG_PING_TIME;
import static com.example.monitordemo.constant.BlackBoxConstant.AVG_SINGLE_PING_TIME;
import static com.example.monitordemo.constant.CommonConstant.API_PREFIX;
import static com.example.monitordemo.constant.CommonConstant.INSTANT_QUERY_PREFIX;

/**
 * 对ping响应时长的监控是一种黑盒监控，故封装在黑盒工具中
 */
@UtilityClass
public class BlackBoxUtil {
    /**
     * 获取ping响应时长 单位毫秒
     * @param start 开始时间
     * @param end 结束时间
     * @param step 步长
     * @param instance 实例ip，传null查全部
     * @return json
     */
    public JSON getAvgPingTimeRange(Date start,Date end,Integer step, String instance){
        String promQl = buildPromQlByParam(instance);
        JSON res = PromQLUtil.getRangeJson(start, end, step, instance, promQl);
        return res;
    }

    /**
     * 获取ping响应时长 单位毫秒
     * @param time 时间
     * @param instance 实例ip，传null查全部
     * @return json
     */
    public JSON getAvgPingTime(Date time,String instance){
        String promQl = buildPromQlByParam(instance);
        String t = PromQLUtil.parseDateToTime(time);
        String executePromQl = API_PREFIX + INSTANT_QUERY_PREFIX + "query=" + promQl + "&time="+t;
        return PromQLUtil.executePromQl(executePromQl);
    }

    /**
     * 构造语句
     * @param instance
     * @return
     */
    private String buildPromQlByParam(String instance) {
        HashMap<String, String> paramMap = new HashMap<>();
        //生产环境job应该使用ping_exporter或者定义配置文件属性
        paramMap.put("job","blackbox");
        paramMap.put("instance", instance);
        String promQl = instance == null ?  StrUtil.format(AVG_PING_TIME, paramMap):StrUtil.format(AVG_SINGLE_PING_TIME,paramMap);
        return promQl;
    }

}
